import type { FieldNamesProps } from '@/components/proTable/interface';
import { isArray } from './is';
import { ResCode } from '@/enum/resCodeEnum';
import type { ResponseResult } from '@/types/response';
import { ElMessage } from 'element-plus';

/**
 * 判断arr1是否包含arr2
 * @param arr1
 * @param arr2
 * @returns
 */
export function containsArray(arr1: string[], arr2: string[]) {
  if (arr1.length < arr2.length) {
    return false;
  }

  // 使用Set来提高查找效率
  const set = new Set(arr1);
  for (const item of arr2) {
    if (!set.has(item)) {
      return false;
    }
  }
  return true;
}

/**
 * @description 处理 prop 为多级嵌套的情况，返回的数据 (列如: prop: user.name)
 * @param {Object} row 当前行数据
 * @param {String} prop 当前 prop
 * @returns {*}
 * */
export function handleRowAccordingToProp(row: { [key: string]: any }, prop: string) {
  if (!prop.includes('.')) return row[prop] ?? '--';
  prop.split('.').forEach((item) => (row = row[item] ?? '--'));
  return row;
}

/**
 * @description 处理 ProTable 值为数组 || 无数据
 * @param {*} callValue 需要处理的值
 * @returns {String}
 * */
export function formatValue(callValue: any) {
  // 如果当前值为数组，使用 / 拼接（根据需求自定义）
  if (isArray(callValue)) return callValue.length ? callValue.join(' / ') : '--';
  return callValue ?? '--';
}

/**
 * @description 处理 prop，当 prop 为多级嵌套时 ==> 返回最后一级 prop
 * @param {String} prop 当前 prop
 * @returns {String}
 * */
export function handleProp(prop: string) {
  const propArr = prop.split('.');
  if (propArr.length == 1) return prop;
  return propArr[propArr.length - 1];
}

/**
 * @description 根据枚举列表查询当需要的数据（如果指定了 label 和 value 的 key值，会自动识别格式化）
 * @param {String} callValue 当前单元格值
 * @param {Array} enumData 字典列表
 * @param {Array} fieldNames label && value && children 的 key 值
 * @param {String} type 过滤类型（目前只有 tag）
 * @returns {String}
 * */
export function filterEnum(callValue: any, enumData?: any, fieldNames?: FieldNamesProps, type?: 'tag') {
  const value = fieldNames?.value ?? 'value';
  const label = fieldNames?.label ?? 'label';
  const children = fieldNames?.children ?? 'children';
  let filterData: { [key: string]: any } = {};
  // 判断 enumData 是否为数组
  if (Array.isArray(enumData)) filterData = findItemNested(enumData, callValue, value, children);
  // 判断是否输出的结果为 tag 类型
  if (type == 'tag') {
    return filterData?.tagType ? filterData.tagType : '';
  } else {
    return filterData ? filterData[label] : '--';
  }
}

/**
 * @description 递归查找 callValue 对应的 enum 值
 * */
export function findItemNested(enumData: any, callValue: any, value: string, children: string) {
  return enumData.reduce((accumulator: any, current: any) => {
    if (accumulator) return accumulator;
    if (current[value] === callValue) return current;
    if (current[children]) return findItemNested(current[children], callValue, value, children);
  }, null);
}

/**
 * @description 生成唯一 uuid
 * @returns {String}
 */
export function generateUUID() {
  let uuid = '';
  for (let i = 0; i < 32; i++) {
    const random = (Math.random() * 16) | 0;
    if (i === 8 || i === 12 || i === 16 || i === 20) uuid += '-';
    uuid += (i === 12 ? 4 : i === 16 ? (random & 3) | 8 : random).toString(16);
  }
  return uuid;
}

/**
 * @description 获取文件名
 * @param filePath
 * @returns
 */
export function getFileName(filePath: string): string {
  const parts = filePath.split('/');
  const fileNameWithExtension = parts[parts.length - 1];
  const lastDotIndex = fileNameWithExtension.lastIndexOf('.');
  if (lastDotIndex === -1) {
    // 如果没有'.'，则返回整个文件名
    return fileNameWithExtension;
  }
  return fileNameWithExtension.substring(0, lastDotIndex);
}

/**
 * 判断容器滚动是否滚动到底部
 * @param {HTMLElement} container
 * @returns {boolean}
 */
export function isScrolledToBottom(container: HTMLElement, freeSpace = 0): boolean {
  return container.scrollTop + container.clientHeight + freeSpace >= container.scrollHeight;
}

export function dateZhFormat(date: Date | string): string {
  if (typeof date === 'string') {
    date = new Date(date);
  }
  const year = date.getFullYear();
  const month = date.getMonth() + 1;
  const day = date.getDate();
  const hour = date.getHours();
  const minute = date.getMinutes();
  const second = date.getSeconds();
  return `${year}年${month}月${day}日 ${hour}:${minute}:${second}`;
}

/**
 * 统一处理响应数据提示信息
 * @param response
 * @returns
 */
export function handleResponseMessage(response?: ResponseResult<any>) {
  if (!response) return;
  if (!response?.message) return;
  if (response?.code === ResCode.SUCCESS) {
    ElMessage.success(response?.message);
  } else {
    ElMessage.error(response?.message || '请求失败，请稍后重试');
  }
}

/**
 * 移除对象中值为 '' 的属性
 * @param obj
 * @returns
 */
export function removeEmptyStrings(obj: { [key: string]: any }) {
  // 获取对象的所有属性名
  const keys = Object.keys(obj);

  // 遍历每个属性
  for (let key of keys) {
    // 如果属性值为空字符串，则删除该属性
    if (obj[key] === '') {
      delete obj[key];
    }
  }

  return obj;
}
